﻿using System;
using System.Collections.Generic;
using System.Data;
using AccesoData.Interfaces;
using Entidades;
using MySql.Data.MySqlClient;

namespace AccesoData.DAOMySql
{
    /// <summary>
    /// clase de acceso a la entidad lugar del manejador de base de datos mysql
    /// </summary>
    public class DAOLugarMySql : ConexionBaseDatos, IDAOLugar
    {


        /// <summary>
        /// metodo que se encarga de almacenar un lugar nuevo en la base de datos
        /// </summary>
        /// <param name="lugarNuevo"> objeto lugar en el que se encuentra todos los datos a
        /// almacenar</param>
        /// <returns>retorna id del lugar agregado</returns>
        public int AgregarLugar( Lugar lugarNuevo)
        {
            try
            {

                MySqlCommand comando = new MySqlCommand();
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "AgregarLugar";

                comando.Parameters.AddWithValue("@nombre", lugarNuevo.Nombre);
                comando.Parameters["@nombre"].Direction = ParameterDirection.Input;
                comando.Parameters.AddWithValue("@tipo", lugarNuevo.Tipo);
                comando.Parameters["@tipo"].Direction = ParameterDirection.Input;
                comando.Parameters.AddWithValue("@idLugar",
                                    lugarNuevo.IdLugar != -1 ? (object)lugarNuevo.IdLugar : null);
                comando.Parameters["@idLugar"].Direction = ParameterDirection.Input;
                int id = 0;
                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    id = (reader[0] == DBNull.Value) ? 0 : (int)reader[0];
                }

                CerrarConexion();
                return id;

            }
            catch (Exception)
            {

                return -1;
            }
        }

        /// <summary>
        /// metodo que elimina un registro de la tabla lugar dado su id
        /// </summary>
        /// <param name="id">id perteneciente al registro a eliminar</param>
        /// <returns>verdadero si se elimino false si no</returns>
        public bool EliminarLugar(int id)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "EliminarLugar";
                comando.Parameters.AddWithValue("@idLugar", id);
                comando.ExecuteNonQuery();
                CerrarConexion();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
        /// <summary>
        /// metodo que edita los datos de un lugar en especifico
        /// </summary>
        /// <param name="lugar">datos del lugar que se va editar</param>
        /// <returns></returns>
        public bool EditarLugar(Lugar lugar)
        {
            MySqlCommand comando = new MySqlCommand();
            comando.Connection = Conexion();
            comando.CommandType = CommandType.StoredProcedure;
            comando.CommandText = "AgregarLugar";

            comando.Parameters.AddWithValue("@nombreLugar", lugar.Nombre);
            comando.Parameters.AddWithValue("@tipoLugar", lugar.Tipo);
            comando.Parameters.AddWithValue("@idForanea",
                                lugar.IdLugar != -1 ? (object)lugar.IdLugar : null);
            comando.Parameters.AddWithValue("@idLugar", lugar.Id);

            comando.Parameters["@idLugar"].Direction = ParameterDirection.Input;
            comando.Parameters["@tipoLugar"].Direction = ParameterDirection.Input;
            comando.Parameters["@idForanea"].Direction = ParameterDirection.Input;
            comando.Parameters["@nombreLugar"].Direction = ParameterDirection.Input;

            comando.ExecuteNonQuery();
            return true;
        }
        /// <summary>
        /// Obtiene el numero identificador de la entidad lugar dado nombre y su tipo
        /// </summary>
        /// <param name="lugar"></param>
        /// <returns></returns>
        public int ObtenerLugarNombreTipo(Lugar lugar)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                Lugar miLugar = FabricaEntidades.ObtenerLugar();
                int id = 0;

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerLugarNombreTipo";
                comando.Parameters.AddWithValue("@nombrelugar", lugar.Nombre);
                comando.Parameters["@nombrelugar"].Direction = ParameterDirection.Input;
                comando.Parameters.AddWithValue("@tipolugar", lugar.Tipo);
                comando.Parameters["@tipolugar"].Direction = ParameterDirection.Input;

                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    id = (reader[0] == DBNull.Value) ? 0 : (int)reader[0];
                }

                return id;
            }
            catch (Exception)
            {

                return -1;
            }
        }

        /// <summary>
        /// obtiene todos los lugares del tipo indicado por referencia
        /// </summary>
        /// <param name="tipo"></param>
        /// <returns></returns>
        public List<Lugar> ObtenerLugarTipo(string tipo)
        {
            try
            {
                List<Lugar> retorno = new List<Lugar>();
                MySqlCommand comando = new MySqlCommand();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerLugarTipo";
                comando.Parameters.AddWithValue("@tipoLugar", tipo);
                comando.Parameters["@tipoLugar"].Direction = ParameterDirection.Input;

                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {

                    Lugar miLugar = FabricaEntidades.ObtenerLugar();
                    miLugar.Id = (int) reader[0];
                    miLugar.Nombre = (String)reader[1];
                    miLugar.Tipo = (String)reader[2];
                    miLugar.IdLugar = (reader[3] == DBNull.Value) ? -1 : (int)reader[3];

                    retorno.Add(miLugar);
                }

                reader.Close();
                CerrarConexion();
                return retorno;
            }
            catch (Exception)
            {

                return null;
            }
        }

        public List<Lugar> ObtenerLugarHijo(Entidad lugar)
        {
            try
            {
                List<Lugar> retorno = new List<Lugar>();
                MySqlCommand comando = new MySqlCommand();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerLugarIdPadre";
                comando.Parameters.AddWithValue("@idLugar", lugar.Id);
                comando.Parameters["@idLugar"].Direction = ParameterDirection.Input;

                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {

                    Lugar miLugar = FabricaEntidades.ObtenerLugar();
                    miLugar.Id = (int)reader[0];
                    miLugar.Nombre = (String)reader[1];
                    miLugar.Tipo = (String)reader[2];
                    miLugar.IdLugar = (reader[3] == DBNull.Value) ? -1 : (int)reader[3];

                    retorno.Add(miLugar);
                }

                reader.Close();
                CerrarConexion();
                return retorno;
            }
            catch (Exception)
            {

                return null;
            }
        }

        /// <summary>
        /// Obtiene todos los datos de un lugar dado el id
        /// </summary>
        /// <param name="id">id del lugar a consultar de la base de datos</param>
        /// <returns> Datos del lugar dado</returns>
        public Lugar ObtenerLugarId( int id )
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                Lugar miLugar = null;

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerLugarId";
                comando.Parameters.AddWithValue("@idLugar", id);
                comando.Parameters["@idLugar"].Direction = ParameterDirection.Input;

                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    miLugar = FabricaEntidades.ObtenerLugar();
                    miLugar.Id = id;
                    miLugar.Nombre = (String)reader[1];
                    miLugar.Tipo = (String)reader[2];
                    miLugar.IdLugar = (reader[3]== DBNull.Value) ? -1: (int) reader[3];
                }

                reader.Close();
                CerrarConexion();
                return miLugar;
            }
            catch (Exception)
            {

                return null;
            }
        }

        

    }
}
